#include "common_config_init.h"
#include "common_media_define.h"
#include "common_product_definition.h"
#include "utils_log.h"

namespace El {
namespace Common {

ConfigInit &ConfigInit::GetInstance()
{
    static ConfigInit instance;
    return instance;
}

ConfigInit::ConfigInit() {}

ConfigInit::~ConfigInit() {}

bool ConfigInit::InitDefaultConfig()
{
    InitLanguage();
    InitCloudModel();
    InitNetwork();
    InitStorage();
    InitRecord();
    InitVideoEncode();
    InitAudioEncode();
    InitRtsp();
    InitRtmp();
    InitOSD();
    InitFileManager();
    InitNtp();
    InitAudioVolume();
    InitAudioInput();    // 初始化音频输入配置
    InitUart();          // 初始化串口配置
    InitSwitchControl(); // 初始化开关控制配置
    InitUsers();         // 初始化用户配置
    InitAlgoManager();   // 初始化算法管理器配置
    InitModelManager();  // 初始化模型管理器配置
    InitGB28181();       // 初始化国标协议配置
    return true;
}

void ConfigInit::InitLanguage()
{
    auto language = ConfigManager::GetInstance().GetDefaultConfig("/language");
    if (language.is_null()) {
        std::vector<std::string> languages;
        if (ProductDefinition::GetInstance().GetValue("languages", languages)) {
            for (const auto &lang : languages) {
                language["support"].push_back(lang); // 支持的语言列表
            }
        } else {
            language["support"] = "zh_CN"; // 默认语言
        }
        language["default"] = languages.front(); // 默认语言
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/language", language);
}

void ConfigInit::InitCloudModel()
{
    nlohmann::json config = Common::ConfigManager::GetInstance().GetDefaultConfig("/cloud_model");
    if (config.is_null()) {
        config["enabled"] = false;

        // 各功能映射到厂商与模型
        config["chat"]["provider"] = "aliyun";
        config["chat"]["model"] = "qwen-plus";

        config["vision"]["provider"] = "aliyun";
        config["vision"]["model"] = "qwen-vl-plus";

        config["realtime_audio"]["provider"] = "aliyun";
        config["realtime_audio"]["model"] = "qwen3-omni-flash-realtime";
        // 交互模式：vad（语音活动检测自动触发）或 manual（手动控制）
        config["realtime_audio"]["mode"] = "vad";

        // 厂商密钥集合
        config["providers"]["aliyun"]["api_key"] = "";
    }

    Common::ConfigManager::GetInstance().SetDefaultConfig("/cloud_model", config);
}

void ConfigInit::InitNetwork()
{
    auto network = Common::ConfigManager::GetInstance().GetDefaultConfig("/network");
    if (network.is_null()) {
        // 默认网卡配置
        network["default_interface"] = "eth0"; // 默认网卡名称

        // eth0网卡配置
        network["interfaces"]["eth0"]["enable"] = true;                     // 是否启用
        network["interfaces"]["eth0"]["type"] = "ethernet";                 // 网卡类型：ethernet
        network["interfaces"]["eth0"]["mode"] = "dhcp";                     // 网络模式: dhcp/static
        network["interfaces"]["eth0"]["ipv4"]["address"] = "192.168.1.100"; // 静态IP地址
        network["interfaces"]["eth0"]["ipv4"]["netmask"] = "255.255.255.0"; // 子网掩码
        network["interfaces"]["eth0"]["ipv4"]["gateway"] = "192.168.1.1";   // 网关地址

        // 全局网络配置
        network["hostname"] = "endless";                 // 主机名
        network["dns"] = {"114.114.114.114", "8.8.8.8"}; // DNS服务器配置(数组形式)
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/network", network);
}

void ConfigInit::InitRecord()
{
    auto record = Common::ConfigManager::GetInstance().GetDefaultConfig("/record");
    if (record.is_null()) {
        record["enable"] = true;
        record["overwrite"] = true;          // 循环覆盖
        record["maxFileDuration"] = 30 * 60; // 录像文件最大时长，单位为秒
        record["maxFileSize"] = 2 * 1024;    // 录像文件最大大小，单位为MB
        record["fileFormat"] = "mp4";        // 录像文件格式
        record["preRecord"] = 10;            // 预录时长,单位秒
        record["delayRecord"] = 10;          // 延录时长,单位秒
        for (uint32_t i = 0; i < CHANNEL_MAX; i++) {
            record["record"][i]["enable"] = true;          // 是否启用录像
            record["record"][i]["quality"] = 1;            // 录像质量等级:0-低,1-中,2-高
            record["record"][i]["autoStartManual"] = true; // 系统启动时自动开启手动录像（全天录像）
        }
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/record", record);
}

void ConfigInit::InitStorage()
{
    auto storage = Common::ConfigManager::GetInstance().GetDefaultConfig("/storage");
    if (storage.is_null()) {
        storage["mountPath"] = "/mnt/udisk";
        storage["warningThreshold"] = 95; // 磁盘使用率超过95%时，发出警告
        storage["reserveSpace"] = 200;    // 预留磁盘空间,单位MB
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/storage", storage);
}

void ConfigInit::InitOSD()
{
    auto osd = Common::ConfigManager::GetInstance().GetDefaultConfig("/osd");
    if (osd.is_null()) {
        osd["enable"] = true;
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/osd", osd);
}

void ConfigInit::InitRtmp()
{
    // 初始化 RTMP 推流默认配置
    auto rtmp = Common::ConfigManager::GetInstance().GetDefaultConfig("/rtmp");
    if (rtmp.is_null()) {
        rtmp["enabled"] = false; // 默认关闭

        // 默认提供一个示例 sink，便于前端展示与修改
        nlohmann::json sink;
        sink["enabled"] = false;
        sink["url"] = "rtmp://127.0.0.1/live/livestream";
        sink["channel"] = 0;     // 默认通道
        sink["stream_type"] = 0; // 默认码流

        rtmp["sinks"] = nlohmann::json::array();
        rtmp["sinks"].push_back(sink);
    }

    Common::ConfigManager::GetInstance().SetDefaultConfig("/rtmp", rtmp);
}

void ConfigInit::InitFileManager()
{
    // 初始化默认配置
    nlohmann::json config = Common::ConfigManager::GetInstance().GetDefaultConfig("/file_manager");
    if (config.is_null()) {
        config["preset_dir"] = "/mnt/assets/audio";
        config["user_dir"] = "/mnt/data/file";
        config["index_dir"] = "/mnt/data/file/index";
        config["max_files_per_type"] = 100;
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/file_manager", config);
}

void ConfigInit::InitVideoEncode()
{
    auto video = Common::ConfigManager::GetInstance().GetDefaultConfig("/video_encode");
    if (video.is_null()) {
        // 第一个索引表示通道号，第二个索引表示主辅码流 (0: 主码流, 1: 子码流)
        video[0][0]["enable"] = true;
        video[0][0]["codec"] = "h264";
        video[0][0]["width"] = 1920; // 添加分辨率
        video[0][0]["height"] = 1080;
        video[0][0]["bitRate"] = 2049; // 主码流示例比特率
        video[0][0]["fps"] = 25;
        video[0][0]["gop"] = 50; // 主码流示例GOP
        video[0][0]["profile"] = "high";

        video[0][1]["enable"] = true;
        video[0][1]["codec"] = "h264";
        video[0][1]["width"] = 640; // 添加分辨率
        video[0][1]["height"] = 480;
        video[0][1]["bitRate"] = 1024; // 子码流示例比特率
        video[0][1]["fps"] = 25;
        video[0][1]["gop"] = 50; // 子码流示例GOP
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/video_encode", video);
}

void ConfigInit::InitAudioEncode()
{
    auto audio = Common::ConfigManager::GetInstance().GetDefaultConfig("/audio_encode");
    if (audio.is_null()) {
        // 第一个索引表示音频通道号
        audio[0]["enable"] = true;
        audio[0]["codec"] = "aac";      // 音频编码格式: opus,aac,g711a,g711u
        audio[0]["sampleRate"] = 16000; // 音频采样率
        audio[0]["bitWidth"] = 16;      // 音频位宽
        audio[0]["channel"] = 1;        // 音频声道数
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/audio_encode", audio);
}

void ConfigInit::InitRtsp()
{
    auto rtsp = Common::ConfigManager::GetInstance().GetDefaultConfig("/rtsp");
    if (rtsp.is_null()) {
        rtsp["enabled"] = true;
        rtsp["port"] = 554;
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/rtsp", rtsp);
}

void ConfigInit::InitNtp()
{
    auto ntp = Common::ConfigManager::GetInstance().GetDefaultConfig("/ntp");
    if (ntp.is_null()) {
        ntp["enable"] = true;                                   // 是否启用NTP
        ntp["servers"] = {"cn.pool.ntp.org", "ntp.aliyun.com"}; // NTP服务器地址列表 "ntp.tuna.tsinghua.edu.cn"
        ntp["interval"] = 3600;                                 // 同步间隔，单位秒
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/ntp", ntp);
}

void ConfigInit::InitAudioVolume()
{
    auto audio_volume = Common::ConfigManager::GetInstance().GetDefaultConfig("/audio/volume");
    if (audio_volume.is_null()) {
        audio_volume["speaker_volume"] = 80;  // 默认扬声器音量
        audio_volume["speaker_mute"] = false; // 默认扬声器非静音
        audio_volume["mic_volume"] = 80;      // 默认麦克风音量
        audio_volume["mic_mute"] = false;     // 默认麦克风非静音
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/audio/volume", audio_volume);
}

void ConfigInit::InitAudioInput()
{
    auto audio_input = Common::ConfigManager::GetInstance().GetDefaultConfig("/audio_input");
    if (audio_input.is_null()) {
        audio_input["source"] = "builtin"; // 默认使用USB声卡: builtin/usb
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/audio_input", audio_input);
}

void ConfigInit::InitUart()
{
    auto uart = Common::ConfigManager::GetInstance().GetDefaultConfig("/uart");
    if (uart.is_null()) {
        uart["ttyAMA2"]["enabled"] = true;
        uart["ttyAMA2"]["port"] = "/dev/ttyAMA2";
        uart["ttyAMA2"]["baudRate"] = 9600;
        uart["ttyAMA2"]["dataBits"] = 8;
        uart["ttyAMA2"]["parity"] = "none"; // "none", "odd", "even"
        uart["ttyAMA2"]["stopBits"] = 1;    // 1 或 2
        uart["ttyAMA2"]["blockMode"] = false;
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/uart", uart);
}

void ConfigInit::InitUsers()
{
    auto users = Common::ConfigManager::GetInstance().GetDefaultConfig("/users");
    if (users.is_null()) {
        users["users"][0]["enabled"] = true;
        users["users"][0]["lastLoginTime"] = 0;
        users["users"][0]["password"] = "b4d7b4e400d3d87cfaca956467bce7f2f4b1fdbddd792f0751af3f81d78d3f79";
        users["users"][0]["role"] = "administrator";
        users["users"][0]["username"] = "admin";
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/users", users);
}

void ConfigInit::InitAlgoManager()
{
    auto algoManager = Common::ConfigManager::GetInstance().GetDefaultConfig("/algo_manager");
    if (algoManager.is_null()) {
        // 算法配置数组：每个成员是一个算法配置，支持多个算法启动
        algoManager["algorithms"] = nlohmann::json::array();

        // 非机动车梯控模型
        nlohmann::json objectDetection;
        objectDetection["type"] = "non_motor_elevator_detection";
        objectDetection["modelPath"] = "/mnt/assets/model/aidetect/det_nmv_hor_elev.bin";
        objectDetection["inputWidth"] = 640;
        objectDetection["inputHeight"] = 384;
        objectDetection["confidenceThreshold"] = 0.5f;
        objectDetection["maxDetections"] = 100;
        objectDetection["enabled"] = false;
        objectDetection["description"] = "非机动车梯控检测";
        algoManager["algorithms"].push_back(objectDetection);

        // 人脸/人形/车辆检测模型
        objectDetection.clear();
        objectDetection["type"] = "human_vehicle_detection";
        objectDetection["modelPath"] = "/mnt/assets/model/aidetect/det_hvf_hor.bin";
        objectDetection["inputWidth"] = 768;
        objectDetection["inputHeight"] = 448;
        objectDetection["confidenceThreshold"] = 0.5f;
        objectDetection["maxDetections"] = 100;
        objectDetection["enabled"] = false;
        objectDetection["description"] = "人脸/人形/车辆检测";
        algoManager["algorithms"].push_back(objectDetection);

        // 人脸抓拍场景使用，要基于人脸人性模型基础上使用
        nlohmann::json faceCapture;
        faceCapture["type"] = "face_capture";
        faceCapture["modelPath"] = "/mnt/assets/model/aivsr/vsr_face_cap.bin";
        faceCapture["inputWidth"] = 1920;
        faceCapture["inputHeight"] = 1080;
        faceCapture["confidenceThreshold"] = 0.5f;
        faceCapture["maxDetections"] = 20;
        faceCapture["enabled"] = false;
        faceCapture["description"] = "人脸抓拍";
        algoManager["algorithms"].push_back(faceCapture);

        // 人脸识别模型
        nlohmann::json faceRecognition;
        faceRecognition["type"] = "face_recognition";
        faceRecognition["modelPath"] = "/mnt/assets/model/aivsr/vsr_fr.bin";
        faceRecognition["inputWidth"] = 1920;
        faceRecognition["inputHeight"] = 1080;
        faceRecognition["confidenceThreshold"] = 0.5f;
        faceRecognition["maxDetections"] = 20;
        faceRecognition["enabled"] = false;
        faceRecognition["description"] = "人脸识别";
        algoManager["algorithms"].push_back(faceRecognition);

        // 自定义yolo算法配置（默认关闭，保留可选）
        nlohmann::json customYolo;
        customYolo["type"] = "yolov8_detection";
        customYolo["modelPath"] = "/mnt/assets/model/yolov8_new_rpn_original.om";
        customYolo["inputWidth"] = 640;
        customYolo["inputHeight"] = 640;
        customYolo["confidenceThreshold"] = 0.5f;
        customYolo["maxDetections"] = 100;
        customYolo["enabled"] = false;
        customYolo["description"] = "自定义YOLOv8检测";
        algoManager["algorithms"].push_back(customYolo);
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/algo_manager", algoManager);
}

void ConfigInit::InitGB28181()
{
    auto gb28181 = Common::ConfigManager::GetInstance().GetDefaultConfig("/gb28181");
    if (gb28181.is_null()) {
        // 根级别配置
        gb28181["enabled"] = true; // 是否启用GB28181协议

        // SIP服务器配置数组
        gb28181["sip_server"] = nlohmann::json::array();

        // 第一个SIP服务器配置
        nlohmann::json server1;
        server1["enabled"] = false;                    // 是否启用此SIP服务器
        server1["device_id"] = "34020000001320000001"; // 设备ID（20位）
        server1["server_id"] = "34020000002000000001"; // SIP服务器ID（20位）
        server1["server_ip"] = "192.168.1.100";        // SIP服务器IP地址
        server1["server_port"] = 5060;                 // SIP服务器端口
        server1["local_port"] = 5060;                  // 本地SIP端口
        server1["password"] = "12345678";              // SIP认证密码
        server1["domain"] = "3402000000";              // 域名
        server1["heartbeat_interval"] = 60;            // 心跳周期（秒）
        server1["register_interval"] = 3600;           // 注册间隔（秒）
        server1["channel_count"] = 2;                  // 通道总数
        server1["civil_code"] = "34020000";            // 行政区划代码

        // 第一个服务器的通道信息列表（字符串数组格式）
        server1["channels"] = {"34020000001320000001", "34020000001320000002"};
        gb28181["sip_server"].push_back(server1);
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/gb28181", gb28181);
}

void ConfigInit::InitSwitchControl()
{
    auto switchControl = Common::ConfigManager::GetInstance().GetDefaultConfig("/switch_control");
    if (switchControl.is_null()) {
        // 广播开关配置
        switchControl["broadcast"]["enabled"] = false;

        // 警灯开关配置
        switchControl["warning_light"]["enabled"] = false;

        // 备用1开关配置
        switchControl["spare1"]["enabled"] = false;

        // 备用2开关配置
        switchControl["spare2"]["enabled"] = false;
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/switch_control", switchControl);
}

void ConfigInit::InitModelManager()
{
    auto modelManager = Common::ConfigManager::GetInstance().GetDefaultConfig("/model_manager");
    if (modelManager.is_null()) {
        // YOLOv8类别标签配置: 字符串数组格式
        // 用户可通过配置API动态修改
        // 默认为空,使用HAL层内置的COCO 80类标签
        modelManager["yolov8"]["class_labels"] = nlohmann::json::array();

        // 示例: 如需自定义标签，可配置如下格式
        // modelManager["yolov8"]["class_labels"] = {"person", "bicycle", "car", ...};
    }
    Common::ConfigManager::GetInstance().SetDefaultConfig("/model_manager", modelManager);
}

} // namespace Common
} // namespace El
